package com.fafu.mq.mqserver.datacenter;

import com.fafu.mq.common.MqException;
import com.fafu.mq.mqserver.core.Binding;
import com.fafu.mq.mqserver.core.Exchange;
import com.fafu.mq.mqserver.core.MSGQueue;
import com.fafu.mq.mqserver.core.Message;

import java.io.IOException;
import java.util.LinkedList;
import java.util.List;

/**
 * 使用这个类来管理所有硬盘上的数据
 * 数据库: 交换机, 队列, 绑定
 * 数据文件: 消息
 * 上述逻辑如果需要操作硬盘, 统一使用这个类来使用. (上层代码不关心数据是存在文件还是硬盘中的)
 */

public class DiskDataCenter {
    // 这个实例用来管理数据库中的数据
    private DataBaseManger dataBaseManger = new DataBaseManger();
    // 这个实例用来管理数据文件中的数据
    private MessageFileManager messageFileManager = new MessageFileManager();

    public void init() {
        // 针对上述两个方法进行初始化
        dataBaseManger.init();
        // 当前 messageFileManger 是空的方法, 如果有需要再进行扩展
        messageFileManager.init();
    }

    //封装交换机操作
    public void insertExchange(Exchange exchange){
        dataBaseManger.insertExchange(exchange);
    }

    public void deleteExchange(String exchangeName){
        dataBaseManger.deleteExchange(exchangeName);
    }

    public List<Exchange> selectAllExchanges(){
        return dataBaseManger.selectAllExchanges();
    }

    // 封装队列操作
    public void insertQueue(MSGQueue queue) throws IOException {
        dataBaseManger.insertQueue(queue);
        // 创建队列的同时, 不仅仅要将队列对象写到数据库中, 还需要创建对应的目录和文件
        messageFileManager.createQueueFiles(queue.getName());
    }

    public void deleteQueue(String queueName) throws IOException {
        dataBaseManger.deleteQueue(queueName);
        // 删除队列的同时, 不仅仅是删除数据库中的对列, 也要删除内存中的文件
        messageFileManager.destroyQueueFiles(queueName);
    }

    public List<MSGQueue> selectAllMSGQueues(){
        return dataBaseManger.selectAllMSGQueues();
    }

    // 封装绑定操作
    public void insertBinding(Binding bindIng){
        dataBaseManger.insertBinding(bindIng);
    }

    public void deleteBinding(Binding bindIng){
        dataBaseManger.deleteBinding(bindIng);

    }

    public List<Binding> selectAllBindings(){
        return dataBaseManger.selectAllBindings();
    }

    // 封装消息操作
    public void sendMessage(MSGQueue queue, Message message) throws IOException, MqException {
        messageFileManager.sendMessage(queue,message);
    }

    public void deleteMessage(MSGQueue queue,Message message) throws IOException, ClassNotFoundException, MqException {
        messageFileManager.deleteMessage(queue,message);
        if(messageFileManager.checkGc(queue.getName())){
            messageFileManager.gc(queue);
        }
    }

    public LinkedList<Message> loadAllMessageFromQueue(String queueName) throws IOException, MqException, ClassNotFoundException {
        return messageFileManager.loadAllMessageFromQueue(queueName);
    }
}
